#ifndef BA813BF0_5656_4E9F_A39B_2D761D39EA4A
#define BA813BF0_5656_4E9F_A39B_2D761D39EA4A

// 工具类，专门实现各种各样的 字符串操作函数
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

class Util
{
public:
    // 字符串处理(从sock 文件中获取一行数据)
    static int readLine(int sock, std::string& out)
    {
        int ch = 'a';
        while(ch != '\n')
        {
            ssize_t s = recv(sock, &ch, 1, 0);
            if(s > 0)
            {
                // 开始输出数据到 out 中
                if(ch == '\r')
                {
                    recv(sock, &ch, 1, MSG_PEEK);   // 窥探下一个字符是什么
                    if(ch == '\n'){
                        // "\r\n" -> 将 "\r\n"= 转为 "\n"
                        recv(sock, &ch, 1, 0);
                    }
                    else{
                        // 下一个就是普通字符, 直接 ch='\n'
                        ch = '\n';
                    }
                }
                // 此时 ch 为普通字符 or ch='\n'
                out.push_back(ch);
            }
            else if(s == 0){
                return 0;
            }
            else{
                return -1;
            }
        }
        return out.size();
    }

    // 切分字符串
    static bool cutString(const std::string& line, std::string& key_out, std::string& value_out, std::string sep)
    {
        auto pos = line.find(sep);
        if(pos != std::string::npos)
        {
            // 找到了
            key_out = line.substr(0, pos);
            value_out = line.substr(pos+sep.size());
            return true;
        }
        return false;
    }

};


#endif /* BA813BF0_5656_4E9F_A39B_2D761D39EA4A */
